/***************************************************************************************************
  *Copyright(C),2010-2017,Sumscope
  *FileName	:  string_aes.h
  *Author	:  scofined.qi
  *Version	:  1.0
  *Date		:  2017/04/19
  *Desc		:  //用于主要说明此程序文件完成的主要功能
  *Relation :  
  *Others	:  //其他内容说明
  *Function :  //主要函数列表，每条记录应包含函数名及功能简要说明
  *History	:  //修改历史记录列表，每条修改记录应包含修改日期、修改者及修改内容简介
***************************************************************************************************/
#pragma once

#include "../core.h"

namespace qb{
	namespace base{

		// 用作类成员或者栈上多次反复使用
        class S_CORE_EXPORT StringAes{
			char bKey[64];
			char subKeys[16][48];
			char keyBlock[16];
		public:
			StringAes(const char* tag);
			void SetTag(const char* tag);
			int Encrypt(const char * pszInText, int insize, char* dataencrypted, int outsize);
			int Decrypt(const char * pszInText, int insize, char* datadecrypted, int outsize);

			/*
			原地加密算法,capcity必须是8的倍数,返回长度一定是8的倍数
			加密后的数据比原始数据要长,且长度肯定是8的倍数
			如果 capcity == ROUND_ALIGN(size,8),那么返回值是capcity,buffer就不是以0结尾的字符串了
			*/
			int EncryptInPlace(char* buffer, int size, int capcity);

			/*
			原地解码算法,size<=capcity且都必须是8的倍数
			*/
			int DecryptInPlace(char* buffer, int size, int capcity);
		};

		class AesCoderImpl;
        class S_CORE_EXPORT BlockAes{
			AesCoderImpl*	m_impl;
		public:
			BlockAes(const char* tag);
			~BlockAes();
			void SetTag(const char* tag);
			int Encrypt(const char * pszInText, int insize, char* dataencrypted, int outsize);
			int Decrypt(const char * pszInText, int insize, char* datadecrypted, int outsize);
		};
		// 慢速实现
        S_CORE_EXPORT int Encrypt(const char * pszInText, int insize, char* dataencrypted, int outsize, const char* key);
        S_CORE_EXPORT int Decrypt(const char * pszInText, int insize, char* datadecrypted, int outsize, const char* key);
	}
}
